package web

import (
	"cloudops/src/common"
	"cloudops/src/config"
	"cloudops/src/web/middleware"
	"github.com/gin-contrib/cors"
	"github.com/gin-contrib/requestid"
	"github.com/gin-gonic/gin"
	ginprometheus "github.com/zsais/go-gin-prometheus"
	"net/http"
	"time"
)

func AgentStartGin(sc *config.AgentConfig) error {
	r := gin.Default()
	//CORS（跨域资源共享）中间件配置
	r.Use(cors.New(cors.Config{
		//允许来自任何域的请求。
		AllowOrigins: []string{"*"},
		// 允许的 HTTP 方法列表
		AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"},
		//允许的请求头部字段
		AllowHeaders: []string{"Origin", "Content-Length", "Content-Type", "Authorization"},
		// 允许客户端访问的响应头部字段
		ExposeHeaders: []string{"Content-Length"},
		// 是否允许发送 Cookie
		AllowCredentials: true,
		//预检请求的有效期为 12 小时。
		MaxAge: 12 * time.Hour,
	}))
	// 恢复中间件，以便在发生 panic 时恢复
	r.Use(gin.Recovery())

	varMap := map[string]interface{}{}
	varMap[common.GIN_CTX_CONFIG_CONFIG] = sc

	// 传递变量
	r.Use(middleware.ConfigMiddleware(varMap))
	// 请求ID
	r.Use(requestid.New())
	//记录 请求ID、请求body、header中token到zap日志中
	r.Use(middleware.NewGinZapLogger(sc.Logger))

	// 暴露metrice
	p := ginprometheus.NewPrometheus("cloudops")
	p.Use(r)

	// 禁用控制台颜色
	gin.DisableConsoleColor()

	// 配置路由信息
	AgentConfigRoutes(r)
	// 读写超时参数
	s := &http.Server{
		Addr:           sc.HttpAddr,      // 监听地址
		Handler:        r,                // 路由
		ReadTimeout:    10 * time.Second, // 读取超时
		WriteTimeout:   10 * time.Second, // 写入超时
		MaxHeaderBytes: 1 << 20,          // 请求头大小
	}
	return s.ListenAndServe()
}

// agent配置路由
func AgentConfigRoutes(r *gin.Engine) {
	base := r.Group("/api")
	{
		base.GET("/ping", ping)

	}
}

// 测试接口
func ping(c *gin.Context) {
	c.JSONP(200, gin.H{
		"message": "pong",
		"code":    200,
	})
}
